package edu.uoc.vmerinom.tfc.action;

import java.text.MessageFormat;
import java.util.Date;
import java.util.List;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.core.Interpolator;

import edu.uoc.vmerinom.tfc.domain.Solicitud;
import edu.uoc.vmerinom.tfc.service.SolicitudesService;
import edu.uoc.vmerinom.tfc.support.Mail;
import edu.uoc.vmerinom.tfc.support.Message;
import edu.uoc.vmerinom.tfc.support.Utils;

/**
 * Manejador encargado de las acciones relacionadas con las solicitudes de
 * acceso al portal.
 * 
 * @author Víctor Manuel Merino Martínez
 * 
 */
@Name("solicitudesAction")
@Scope(ScopeType.CONVERSATION)
public class SolicitudesAction {

	/**
	 * Default Serial Version ID.
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Solicitud seleccionada.
	 */
	Solicitud solicitud;

	/**
	 * Listado de solicitudes.
	 */
	List<Solicitud> solicitudes;

	/**
	 * Código de referencia de la solicitud.
	 */
	String referencia;

	/**
	 * Servicio de solicitudes.
	 */
	@In(create = true)
	SolicitudesService solicitudesService;

	/**
	 * Indica si se listan las solicitudes o no.
	 */
	boolean listarSolicitudes;

	/**
	 * Indica si se edita la solicitud o no.
	 */
	boolean editarSolicitud;

	/**
	 * Indica si se muestra el estado de la solicitud o no.
	 */
	boolean estadoSolicitud;

	/**
	 * Inicializa los datos al crear el bean.
	 */
	@Create
	public void init() {
		solicitud = new Solicitud();
		listarSolicitudes = true;
		editarSolicitud = false;
		estadoSolicitud = false;
	}

	/**
	 * Carga los datos necesarios para mostrar la primera pantalla.
	 */
	public void load() {
		solicitudes = solicitudesService.obtenerSolicitudes();
		solicitud = new Solicitud();
		listarSolicitudes = true;
		editarSolicitud = false;
		estadoSolicitud = false;
	}

	/**
	 * Guarda el estado de la solicitud.
	 */
	public void guardarEstadoSolicitud() {
		boolean correcto = true;

		if (solicitud.getAceptada() == null) {
			correcto = false;
			Message.error("editrequest.error.status.null");
		}
		if (solicitud.getResolucion() == null || "".equals(solicitud.getResolucion())) {
			correcto = false;
			Message.error("editrequest.error.resolution.null");
		}

		if (correcto) {
			final Date hoy = new Date(System.currentTimeMillis());
			solicitud.setFechaResolucion(hoy);
			solicitudesService.insertarModificarSolicitud(solicitud);
			final String recipient = solicitud.getEmail();
			final String subject = Message.get("editrequest.mail.subject");
			final String message = Message.get("editrequest.mail.message");
			final Object[] params = new String[2];
			params[0] = Utils.date2String(solicitud.getFechaEntrada(), "dd/MM/yyyy HH:mm");
			params[1] = solicitud.getReferencia();
			Mail.send(recipient, MessageFormat.format(subject, params), MessageFormat.format(message, params));
			Message.info("editrequest.info.success");
			listarSolicitudes = true;
			estadoSolicitud = false;
			editarSolicitud = false;
		}
	}

	/**
	 * Guarda los cambios que se hayan producido en la solicitud, sólo si pasa
	 * la validación.
	 */
	public void guardarCambiosSolicitud() {
		if (validar()) {
			guardarSolicitud();
		}
	}

	/**
	 * Guarda la solicitud.
	 */
	private void guardarSolicitud() {
		solicitudesService.insertarModificarSolicitud(solicitud);
		final Interpolator inter = Interpolator.instance();
		final String recipient = solicitud.getEmail();
		final String subject = inter.interpolate("#{messages['request.mail.subject']}");
		final String message = inter.interpolate("#{messages['request.mail.message']}");
		final Object[] params = new String[7];
		params[0] = Utils.date2String(solicitud.getFechaEntrada(), "dd/MM/yyyy HH:mm");
		params[1] = solicitud.getReferencia();
		params[2] = solicitud.getNombre();
		params[3] = solicitud.getPrimerApellido();
		params[4] = solicitud.getSegundoApellido();
		params[5] = solicitud.getNombreGrupo();
		params[6] = solicitud.getComentarios();
		Mail.send(recipient, subject, MessageFormat.format(message, params));
		Message.info("request.info.success");
	}

	/**
	 * Envía la solicitud previamente completada por el usuario solicitante para
	 * ser almacenada para su posterior revisión por el usuario registrado
	 * encargado. Para enviarse deberá pasar una validación de campos.
	 */
	public void enviarSolicitud() {
		if (validar()) {
			final Long time = System.currentTimeMillis();
			final Date hoy = new Date(time);
			solicitud.setFechaEntrada(hoy);
			final String referencia = Utils.encrypt(time.toString(), Utils.SHA1);
			solicitud.setReferencia(referencia);
			guardarSolicitud();
			solicitud = new Solicitud();
		}
	}

	/**
	 * Carga los datos necesarios para mostrar la pantalla de edición de
	 * solicitud.
	 */
	public void editar() {
		listarSolicitudes = false;
		editarSolicitud = true;
		estadoSolicitud = false;
	}

	/**
	 * Carga los datos necesarios para volver al listado de solicitudes.
	 */
	public void volver() {
		load();
	}

	/**
	 * Carga los datos para mostrar el estado de la solicitud. Dependiendo de la
	 * referencia de la solicitud recibida (que sea o no válida) se mostrará una
	 * pantalla de error o bien se mostrará la pantalla con los datos de la
	 * solicitud.
	 * 
	 * @return Cadena con el destino (pantalla) a mostrar
	 */
	public String comprobarSolicitud() {
		String path = "success";
		solicitud = solicitudesService.obtenerSolicitud(referencia);
		if (solicitud == null) {
			final Object[] params = new String[1];
			params[0] = referencia;
			Message.error("checkrequest.error.code", params);
			path = "fail";
		} else {
			editarSolicitud = false;
			listarSolicitudes = false;
			estadoSolicitud = true;
		}
		return path;
	}

	/**
	 * Valida los campos de la solicitud.
	 * 
	 * @return <code>true</code> si la validación de campos es correcta.
	 *         <code>false</code> en caso contrario.
	 */
	private boolean validar() {
		boolean result = true;
		if (solicitud.getNombre() == null || "".equals(Utils.deleteBlankSpaces(solicitud.getNombre()))) {
			Message.error("request.error.name.null");
			result = false;
		}
		if (solicitud.getPrimerApellido() == null || "".equals(Utils.deleteBlankSpaces(solicitud.getPrimerApellido()))) {
			Message.error("request.error.surname.null");
			result = false;
		}
		if (solicitud.getEmail() == null || "".equals(Utils.deleteBlankSpaces(solicitud.getEmail()))) {
			Message.error("request.error.email.null");
			result = false;
		} else if (!Utils.validateEmail(solicitud.getEmail())) {
			final Object[] params = new String[1];
			params[0] = solicitud.getEmail();
			Message.error("request.error.email.format", params);
			result = false;
		}
		if (solicitud.getNombreGrupo() == null || "".equals(Utils.deleteBlankSpaces(solicitud.getNombreGrupo()))) {
			Message.error("request.error.band.name.null");
			result = false;
		}

		return result;
	}

	public Solicitud getSolicitud() {
		return solicitud;
	}

	public void setSolicitud(Solicitud solicitud) {
		this.solicitud = solicitud;
	}

	public String getReferencia() {
		return referencia;
	}

	public void setReferencia(String referencia) {
		this.referencia = referencia;
	}

	public List<Solicitud> getSolicitudes() {
		return solicitudes;
	}

	public void setSolicitudes(List<Solicitud> solicitudes) {
		this.solicitudes = solicitudes;
	}

	public boolean isListarSolicitudes() {
		return listarSolicitudes;
	}

	public void setListarSolicitudes(boolean listarSolicitudes) {
		this.listarSolicitudes = listarSolicitudes;
	}

	public boolean isEditarSolicitud() {
		return editarSolicitud;
	}

	public void setEditarSolicitud(boolean editarSolicitud) {
		this.editarSolicitud = editarSolicitud;
	}

	public boolean isEstadoSolicitud() {
		return estadoSolicitud;
	}

	public void setEstadoSolicitud(boolean estadoSolicitud) {
		this.estadoSolicitud = estadoSolicitud;
	}
}
